Linux 命令- rsync

        rsync从字面上的意思可以理解为remote sync (远程同步)这样可以理解的更深刻一些。Rsync不仅可以远程同步数据(类似于scp),当然还可以本地同步数据(类似于cp),但不同于cp或scp的一点是,rsync不像cp/scp一样会覆盖以前的数据(如果数据已经存在),它会先判断已经存在的数据和新数据有什么不同,只有不同时才会把不同的部分覆盖掉。如果Linux没有rsync命令使用yum安装

1
yum install -y rsync

命令语法

1
2
3
4
5
6
rsync [OPTION]... SRC DEST
rsync [OPTION]... SRC [USER@]host:DEST
rsync [OPTION]... [USER@]HOST:SRC DEST
rsync [OPTION]... [USER@]HOST::SRC DEST
rsync [OPTION]... SRC [USER@]HOST::DEST
rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]

        对应以上六种命令格式,rsync有六种不同的工作模式:

  1. 拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号 : 分隔符时就启动这种工作模式。
1
rsync -a /data/backup
  1. 使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号 : 分隔符时启动该模式。
1
rsync -avz *.c foo:src
  1. 使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号 : 分隔符时启动该模式。
1
rsync -avz foo:src/bar /data
  1. 从远程rsync服务器中拷贝文件到本地。当SRC路径信息包含“::”分隔符时启动该模式。
1
rsync -av root@192.168.78.192::www /databack
  1. 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含“::”分隔符十启动该模式。
1
rsync -av /databack root@192.168.78.192::www
  1. 列远程机的文件列表。类似于rsync传输,不过主要在命令中省略掉本机信息即可
1
rsync -v rsync://192.168.78.192/www

命令参数

  • -v, –verbose 详细模式输出。
  • -q, –quiet 精简输出模式。
  • -c, –checksum 打开校验开关,强制对文件传输进行校验。
  • -a, –archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD。
  • -r, –recursive 对子目录以递归模式处理。
  • -R, –relative 使用相对路径信息。
  • -b, –backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用–suffix选项来指定不同的备份文件前缀。
  • –backup-dir 将备份文件(如~filename)存放在在目录下。
  • -suffix=SUFFIX 定义备份文件前缀。
  • -u, –update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件,不覆盖更新的文件。
  • -l, –links 保留软链结。
  • -L, –copy-links 想对待常规文件一样处理软链结。
  • –copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结。
  • –safe-links 忽略指向SRC路径目录树以外的链结。
  • -H, –hard-links 保留硬链结。
  • -p, –perms 保持文件权限。
  • -o, –owner 保持文件属主信息。
  • -g, –group 保持文件属组信息。
  • -D, –devices 保持设备文件信息。
  • -t, –times 保持文件时间信息。
  • -S, –sparse 对稀疏文件进行特殊处理以节省DST的空间。
  • -n, –dry-run现实哪些文件将被传输。
  • -w, –whole-file 拷贝文件,不进行增量检测。
  • -x, –one-file-system 不要跨越文件系统边界。
  • -B, –block-size=SIZE 检验算法使用的块尺寸,默认是700字节。
  • -e, –rsh=command 指定使用rsh、ssh方式进行数据同步。
  • –rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息。
  • -C, –cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件。
  • –existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件。
  • –delete 删除那些DST中SRC没有的文件。
  • –delete-excluded 同样删除接收端那些被该选项指定排除的文件。
  • –delete-after 传输结束以后再删除。
  • –ignore-errors 及时出现IO错误也进行删除。
  • –max-delete=NUM 最多删除NUM个文件。 -
  • -partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输。
  • –force 强制删除目录,即使不为空。
  • –numeric-ids 不将数字的用户和组id匹配为用户名和组名。
  • –timeout=time ip超时时间,单位为秒。
  • -I, –ignore-times 不跳过那些有同样的时间和长度的文件。
  • –size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间。
  • –modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0。
  • -T –temp-dir=DIR 在DIR中创建临时文件。
  • –compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份。
  • -P 等同于 –partial。
  • –progress 显示备份过程。
  • -z, –compress 对备份的文件在传输时进行压缩处理。
  • –exclude=PATTERN 指定排除不需要传输的文件模式。
  • –include=PATTERN 指定不排除而需要传输的文件模式。
  • –exclude-from=FILE 排除FILE中指定模式的文件。
  • –include-from=FILE 不排除FILE指定模式匹配的文件。
  • –version 打印版本信息。
  • –address 绑定到特定的地址。
  • –config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件。
  • –port=PORT 指定其他的rsync服务端口。
  • –blocking-io 对远程shell使用阻塞IO。
  • -stats 给出某些文件的传输状态。
  • –progress 在传输时现实传输过程。
  • –log-format=formAT 指定日志文件格式。
  • –password-file=FILE 从FILE中得到密码。
  • –bwlimit=KBPS 限制I/O带宽,KBytes per second。
  • -h, –help 显示帮助信息。

        常用选项:-a、-v、–delete、–exclude

使用实例

        试验准备

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost ~]# mkdir rsync
[root@localhost ~]# cd rsync
[root@localhost rsync]# mkdir test1
[root@localhost rsync]# cd test1
[root@localhost test1]# touch 1 2 3
[root@localhost test1]# ln -s /root/123.txt ./123.txt
[root@localhost test1]# ls -l
总用量 0
-rw-r--r-- 1 root root 0 6月 10 12:58 1
lrwxrwxrwx 1 root root 13 6月 10 12:59 123.txt -> /root/123.txt
-rw-r--r-- 1 root root 0 6月 10 12:58 2
-rw-r--r-- 1 root root 0 6月 10 12:58 3
[root@localhost test1]# cd ..

实例1:使用-a选项

1
2
3
4
5
[root@localhost rsync]# rsync -a test1 test2
[root@localhost rsync]# ls test2
test1
[root@localhost rsync]# ls test2/test1/
1 123.txt 2 3

        这里有一个问题,就是本来想把test1目录直接拷贝成test2目录,可结果rsync却新建了test2目录,然后把test1目录放到了test2目录中。为了避免这样的情况,可以这样做:

1
2
3
4
5
6
7
8
[root@localhost rsync]# rm -rf test2
[root@localhost rsync]# rsync -a test1/ test2/
[root@localhost rsync]# ls -l test2/
总用量 0
-rw-r--r-- 1 root root 0 6月 10 12:58 1
lrwxrwxrwx 1 root root 13 6月 10 12:59 123.txt -> /root/123.txt
-rw-r--r-- 1 root root 0 6月 10 12:58 2
-rw-r--r-- 1 root root 0 6月 10 12:58 3

        加个斜杠就可以了,所以建议在使用rsync备份目录时要养成加斜杠的习惯。-a选项表示以递归方式传输文件,并保持所有属性,等同于-rlptgoD。-a选项后面可以跟一个 --no-OPTION 这个表示关闭 -rlptgoD中的某一个,例如,-a--no-l 等同于 -rptgoD。下面看一看-l选项的作用:

1
2
3
4
5
6
7
8
9
10
11
[root@localhost rsync]# rsync -av --no-l test1/ test2/
sending incremental file list
created directory test2
./
1
skipping non-regular file "123.txt"
2
3
sent 200 bytes received 72 bytes 544.00 bytes/sec
total size is 13 speedup is 0.05

        使用-v选项看起来方便,上例跳过了非普通文件123.txt,其实123.txt是一个软连接文件,如果不使用-l选项则不理会软连接文件的。虽然加上-l选项会把软连接文件给拷贝过去,但是软连接的目标文件却没有拷贝过去。

实例2:使用-L选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost rsync]# rsync -avL test1/ test2/
sending incremental file list
created directory test2
./
1
123.txt
2
3
sent 231 bytes received 91 bytes 644.00 bytes/sec
total size is 0 speedup is 0.00
[root@localhost rsync]# ls -l test2/
总用量 0
-rw-r--r-- 1 root root 0 6月 10 12:58 1
-rw-r--r-- 1 root root 0 6月 10 12:39 123.txt
-rw-r--r-- 1 root root 0 6月 10 12:58 2
-rw-r--r-- 1 root root 0 6月 10 12:58 3

        加上-L选项就可以把SRC中软连接的目标文件给拷贝到DST。

实例3:使用-u选项

        首先查看一下test1/1和test2/1的创建时间(肯定是一样的),然后使用touch修改一下test2/1的创建时间(此时test2/1要比test1/1的创建时间晚了一些),如果不加-u选项的话,会把test2/1的创建时间编程和test1/1的创建时间一样。

1
2
3
4
5
6
7
8
9
[root@localhost rsync]# ll test1/1 test2/1
-rw-r--r-- 1 root root 0 6月 10 12:58 test1/1
-rw-r--r-- 1 root root 0 6月 10 12:58 test2/1
root@localhost rsync]# touch test2/1
[root@localhost rsync]# ll test2/1
-rw-r--r-- 1 root root 0 6月 10 13:20 test2/1
[root@localhost rsync]# rsync -a test1/1 test2/
[root@localhost rsync]# ll test2/1
-rw-r--r-- 1 root root 0 6月 10 12:58 test2/1

        加上-u选项后,不会再把test1/1同步为test2/1了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost rsync]# touch test2/1
[root@localhost rsync]# ll test2/1
-rw-r--r-- 1 root root 0 6月 10 13:31 test2/1
[root@localhost rsync]# rsync -avu test1/ test2/
sending incremental file list
./
123.txt -> /root/123.txt
sent 100 bytes received 18 bytes 236.00 bytes/sec
total size is 13 speedup is 0.11
[root@localhost rsync]# ll test2/1
-rw-r--r-- 1 root root 0 6月 10 13:31 test2/1
[root@localhost rsync]# ll test1/1
-rw-r--r-- 1 root root 0 6月 10 12:58 test1/1

实例4:使用 –delete选项

        首先删除test1/123.txt

1
2
3
[root@localhost rsync]# rm -f test1/123.txt
[root@localhost rsync]# ls test1/
1 2 3

        然后把test1/目录同步到test2/目录下

1
2
3
4
5
6
7
8
9
[root@localhost rsync]# rsync -av test1/ test2/
sending incremental file list
./
1
sent 94 bytes received 34 bytes 256.00 bytes/sec
total size is 0 speedup is 0.00
[root@localhost rsync]# ls test2/
1 123.txt 2 3

        test2/目录并没有删除掉123.txt,下面加上 --delete 选项:

1
2
3
4
5
6
7
8
[root@localhost rsync]# rsync -av --delete test1/ test2/
sending incremental file list
deleting 123.txt
sent 52 bytes received 12 bytes 128.00 bytes/sec
total size is 0 speedup is 0.00
[root@localhost rsync]# ls test2/
1 2 3

        test2/目录里的123.txt也被删除了,这就是 --delete 选项的用处。还有一种情况就是如果在DST增加了文件了,而SRC当中没有这些文件,同步时加上 --delete 选项后同样会删除新增的文件:

1
2
3
4
5
6
7
8
9
10
[root@localhost rsync]# touch test2/4
[root@localhost rsync]# ls test1/
1 2 3
[root@localhost rsync]# ls test2/
1 2 3 4
[root@localhost rsync]# rsync -a --delete test1/ test2/
[root@localhost rsync]# ls test1/
1 2 3
[root@localhost rsync]# ls test2/
1 2 3

实例5:使用 –exclude选项

1
2
3
4
5
6
[[root@localhost rsync]# touch test1/4
[root@localhost rsync]# rsync -a --exclude="4" test1/ test2/
[root@localhost rsync]# ls test1/
1 2 3 4
[root@localhost rsync]# ls test2/
1 2 3

        另外还可以使用匹配字符 *

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost rsync]# touch test1/1.txt test1/2.txt
[root@localhost rsync]# ls test1/
1 1.txt 2 2.txt 3 4
[root@localhost rsync]# rsync -a --progress --exclude="*.txt" test1/ test2/
sending incremental file list
./
4
0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/5)
sent 104 bytes received 34 bytes 276.00 bytes/sec
total size is 0 speedup is 0.00
[root@localhost rsync]# ls test2/
1 2 3 4

        上例中,连带着使用了 --progress 选项,这个主要是用来观察rsync同步过程的状态的。简单总结一下,平时使用rsync同步数据的时候,使用-a选项基本上就可以达到想要的效果了,只是有时候会有个别的需求,会用到 -a --no-OPTION , -u , -L , --delete , --exclude 以及 --progress 这些选项。

实例6:ssh隧道方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
root@localhost rsync]# rsync -avL test1/ www@192.168.0.101:/tmp/test2/
www@192.168.0.101's password:
sending incremental file list
created directory /tmp/test2
./
1
1.txt
2
2.txt
3
4
sent 327 bytes received 129 bytes 182.40 bytes/sec
total size is 0 speedup is 0.00

        这种方式是通过ssh拷贝数据,需要输入192.168.0.101那台机器www账户的密码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost rsync]# rsync -avL www@192.168.0.101:/tmp/test2/ ./test3/
www@192.168.0.101's password:
receiving incremental file list
created directory ./test3
./
1
1.txt
2
2.txt
3
4
sent 128 bytes received 351 bytes 38.32 bytes/sec
total size is 0 speedup is 0.00

        以上两种凡是如果写到脚背里,备份起来就有麻烦了,因为要输入密码,脚本本来就是自动的,不可能做到。但是不代表没有解决办法。那微是统计过密钥验证,密钥不设立密码就ok了。

        在操作以前先设置主机信息:192.168.0.10(主机名yanyi-1)和192.168.0.101(主机名yanyi),需要从yanyi-1拷贝数据到yanyi上。

        首先确认一下yanyi-1上是否有这个文件 /root/.ssh/id_rsa.pub

1
2
[root@yanyi-1 ~]# ssh-keygen
Generating public/private rsa key pair.

        如果Linux不存在这个文件,按如下方法生成:

1
2
3
4
5
6
7
8
9
[root@yanyi-1 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
3b:74:af:e8:08:ac:99:30:3f:ef:84:7a:a0:a6:3d:89 root@Aming-1

        在这个过程中会有一些交互的过程,它首先提示要输入这个密钥的密码,出于安全考虑应该定义个密码,但是目的就是为了自动化同步数据,所以这里不输入任何密码,直接按回车,即密码为空。最后则生成了私钥 /root/.ssh/id_rsa 和公钥文件 /root/.ssh/id_rsa.pub

        把公钥文件的内容拷贝到目标机器上:

1
2
root@yanyi-1 ~]# cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA5SPyJ/kliGTAMUan/GCN325VS8jMxvOn4uQoLU/NqBpCI3MrmvSucv6EAzxx1J2uOssW08el06LG+cUwXmm5mkqDRBV6C9qNnR/bVV5vr3QsUwbKPr7fdyJvruQWWR7cSL+mjP0SYmG2Qy2JcM3hl1IZArzC6yeUnq2Gwbax8LgbZE3XfRfOYdimwyh5Tfft7yLYipWc37k+oRUWkI3mW7PalsOlfQhxrLD/lS891y6RdSbGxMJWPoV0KMFbVh+uJgyAXpeuWl+F+/iuQPzb6w3h4pWI31bvbsE9BU82jSzHYEjpq3SN2MJN2vaLs5a0mVpm9zka/h4ITFB8Uy1iSQ== root@yanyi-1

        复制主机yanyi-1的 /root/.ssh/id_rsa.pub 文件内容,并粘贴到主机yanyi的 /home/www/.ssh/authorized_keys 中:

1
[root@yanyi ~]# vim /home/www/.ssh/authorized_keys

        这一步也许会遇到/home/www/.ssh目录不存在的问题,可以手动创建,并修改目录权限为700,也可以执行 ssh-krygen 命令生成这个目录。保存/home/www/.ssh/authorized_keys文件后,再到主机yanyi-1上执行:

1
2
3
[root@yanyi-1 ~]# ssh www@192.168.0.101
Last login: Wed Jun 12 12:24:34 2013 from 192.168.0.10
[www@yanyi ~]$

        现在不用输入密码也可以登录主机yanyi了。下面先用yanyi主机退出来,再从主机yanyi-1上执行rsync命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@yanyi-1 ~]# rsync -av rsync/test1/ www@192.168.0.101:/tmp/test4/
sending incremental file list
created directory /tmp/test4
./
1
1.txt
2
2.txt
3
4
sent 327 bytes received 129 bytes 912.00 bytes/sec
total size is 0 speedup is 0.00

实例7:后台服务方式

        这种方式可以理解成,在远程主机上建立一个rsync的服务器,在服务器上匹配好rsync的各种应用,然后本机作为rsync的一个客户端去连接远程的rsync服务器。

1、建立并配置rsync的配置文件 /etc/rsyncd.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@yanyi-1 ~]# vim /etc/rsyncd.conf
#port=873
log file=/var/log/rsync.log
pid file=/var/run/rsyncd.pid
#address=192.168.0.10
[test]
path=/root/rsync
use chroot=true
max connections=4
read only=no
list=true
uid=root
gid=root
auth users=test
secrets file=/etc/rsyncd.passwd
hosts allow=192.168.0.101

        其中配置文件分为两部分:全局置部分和模块配置部分。全局部分就是几个参数而已,就像rsyncd.conf中port、log file、pid file、address这些都属于全局配置。而 [test]以下部分就是模块配置部分了。一个配置文件中可以有多个模块,模块名自定义,格式就像rsyncd.conf中的这样。其实模块中的一些参数例如,use chroot、max connections、uid、gid、auth users、secrets file以及hosts allow都恶意可配置成全局的参数。当然给出的参数并不是所有的,可以通过 man rsyncd.conf 获得更多信息。

        下面简单解释一下这些参数的意义 :

  • port 指定在哪个端口启动rsyncd服务,默认是873
  • log file 指定日志文件
  • pid file 指定pid文件,这个文件的作用涉及到服务的启动以及停止等进程管理操作
  • address 指定启动rsyncd服务的IP,假如你的机器有多个IP,就可以指定其中一个启动rsyncd服务,默认是在全部IP上启动
  • [test] 指定模块名,自定义
  • path 指定数据存放的路径
  • use chroot true|false 默认是true,意思是在传输文件以前首先chroot到path参数所指 定的目录下。这样做的原因是实现额外的安全防护,但是缺点是需要以roots权限,并且不能备份指向外部的符号连接所指向的目录文件。默认情况下chroot值为true,如果数据当中有软连接文件的话建议设置成false。
  • max connections 指定最大的连接数,默认是0即没有限制
  • read only ture|false 如果为true则不能上传到该模块指定的路径下
  • list 指定当用户查询该服务器上的可用模块时,该模块是否被列出,设定为true则列出,false则隐藏
  • uid/gid 指定传输文件时,以哪个用户/组的身份传输
  • auth users 指定传输时要使用的用户名
  • secrets file 指定密码文件,该参数连同上面的参数如果不指定则不使用密码验证,注 意该密码文件的权限一定要是600
  • hosts allow 指定被允许连接该模块的主机,可以是IP或者网段,如果是多个,之间用空格隔开

2、编辑secrets file,保存后要赋予600权限,如果权限不对,不能完成同步

1
2
3
[root@yanyi-1 ~]# cat /etc/rsyncd.passwd
test:test123
[root@yanyi-1 ~]# chmod 600 /etc/rsyncd.passwd

3、启动rsync服务

1
[root@yanyi-1 ~]# rsync --daemon --config=/etc/rsyncd.conf

        启动后,可以查看一下日志,并查看端口是否启动:

1
2
3
4
[root@yanyi-1 ~]# cat /var/log/rsync.log
[root@yanyi-1 ~]# netstat -lnp |grep 873
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 12066/rsync
tcp 0 0 :::873 :::* LISTEN 12066/rsync

        如果想开机启动,把 rsync --daemon --config=/etc/rsyncd.conf 写入到 /etc/rc.d/rc.local 文件中。

4、到另一台机器上测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@yanyi ~]# rsync -avL test@192.168.0.10::test/test1/ /tmp/test5/
Password:
receiving incremental file list
created directory /tmp/test5
./
1
1.txt
2
2.txt
3
4
sent 143 bytes received 354 bytes 994.00 bytes/sec
total size is 0 speedup is 0.00

        刚提到有一个选项叫做 use chroot 默认为true,如果为true,同步的文件中有软连接,则会有问题。首先在主机yanyi-1的/root/rsync/test1/目录下创建一个软连接文件:

1
2
3
[root@yanyi-1 ~]# ln -s /root/test.txt rsync/test1/test.txt
[root@yanyi-1 ~]# ls -l rsync/test1/test.txt
lrwxrwxrwx 1 root root 14 6月 12 13:24 rsync/test1/test.txt -> /root/test.txt

        然后再到主机yanyi上同步:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@yanyi ~]# rsync -avL test@192.168.0.10::test/test1/ /tmp/test6/
Password:
receiving incremental file list
symlink has no referent: "/test1/test.txt" (in test)
created directory /tmp/test6
./
1
1.txt
2
2.txt
3
4
sent 143 bytes received 419 bytes 1124.00 bytes/sec
total size is 0 speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors) (code
23) at main.c(1532) [generator=3.0.6]

        可以看到,如果设置 use chroot 为true则同步软连接文件会有问题,把主机yanyi-1的rsync配置文件修改一下,把true改为false:

1
2
3
[root@yanyi-1 ~]# sed -i 's/use chroot=true/use chroot=false/' /etc/rsyncd.conf
[root@yanyi-1 ~]# grep 'use chroot' /etc/rsyncd.conf
use chroot=false

        然后再到主机yanyi上再次执行同步:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@yanyi ~]# rsync -avL test@192.168.0.10::test/test1/ /tmp/test7/
Password:
receiving incremental file list
created directory /tmp/test7
./
1
1.txt
2
2.txt
3
4
test.txt
sent 162 bytes received 410 bytes 1144.00 bytes/sec
total size is 0 speedup is 0.00

        这样就没有任何问题了。为什么修改完rsyncd.conf配置文件后,没有重启rsyncd服务?其实这是rsync的一个特定机制,配置文件即实时生效的,不用重启服务。

        上面的例子中,都有输入密码,这样同样不能写入脚本中自动执行,其实这种方式也是可以不用手动输入密码的,有两种实现方式:

1、指定密码文件

        在客户端上,也就是主机yanyi上,编辑一个密码文件:

1
[root@yanyi ~]# vim /etc/pass

        加入test用户的密码:

1
2
[root@yanyi ~]# cat /etc/pass
test123

        修改密码文件的权限:

1
[root@yanyi ~]# chmod 600 /etc/pass

        在同步的时候,指定一下密码文件,就可以省去输入密码的步骤了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@yanyi ~]# rsync -avL test@192.168.0.10::test/test1/ /tmp/test8/ --password-file=/etc/pass
receiving incremental file list
created directory /tmp/test8
./
1
1.txt
2
2.txt
3
4
test.txt
sent 190 bytes received 451 bytes 1282.00 bytes/sec
total size is 0 speedup is 0.00
2、在rsync服务器端不指定用户

        在服务端也就是主机yanyi-1上修改配置文件rsyncd.conf,去掉关于认证账户的配置项(auth user和secrets file这两行):

1
sed -i 's/auth users/#auth users/;s/secrets file/#secrets file/' /etc/rsyncd.conf

        上面的命令是把“auth users”和“secrets file”两行的最前面加一个“#”,这样就把这两行注释掉了,使其失去意义。sed的这种用法,只是用分号把两个替换的子命令块给替换了。然后到客户端主机yanyi上测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
rsync -avL 192.168.0.10::test/test1/ /tmp/test9/
receiving incremental file list
created directory /tmp/test9
./
1
1.txt
2
2.txt
3
4
test.txt
sent 162 bytes received 410 bytes 1144.00 bytes/sec
total size is 0 speedup is 0.00

        注意,这里不用再加test这个用户了,默认是以root的身份拷贝的,现在已经不需要输入密码了。

实例8:根据一个文件列表文档来同步

        有时候,需要根据一个文档中的文件列表来同步文件。例,1.txt是文件列表,内容为:

1
2
3
4
cat 1.txt
/data/a/a.txt
/data/b.txt
/data/c/b/c.txt

        同步命令是:

1
rsync -av --files-from=1.txt / ip::module/

        需要注意的是,1.txt中如果写全局路径,那么source目录需要写/

实例9:在远程自动创建目录

        默认情况下,使用rsync的时候,不能自动创建级联目录。

1
rsync -a /data/1/2/3/1.txt 1.1.1.1:/data/1/2/3/1.txt

        这样会报错的。改一改上边的命令

1
rsync -a /data/1/2/3/1.txt 1.1.1.1:/data/

        这样同样也达不到想要的效果。虽然不在报错,但是只是把1.txt放到了1.1.1.1:/data/目录下。

        rsync有个选项就是-R,会帮助我们自动创建级联目录。所以上边的命令应该改成

1
rsync -aR /data/1/2/3/1.txt 1.1.1.1:/data/

        这样就会在1.1.1.1:/data/目录下创建1/2/3/这样的级联目录,类似mkdir -p

实例10:只同步指定类型的文件

        需求:同步某个目录下所有的图片(*.jpg),该目录下有很多其他的文件,但只想同步*.jpg的文件。

        rsync有一个 --exclude 可以排除指定文件,还有一个 --include 选项的作用正好和 --exclude 相反。

        直接使用 --include="*.jpg" 可否实现?

1
rsync -av --include="*.jpg" /src/ /des/

        实验证明,这是不对的。

        正确的答案是:

1
rsync -av --include="*.jpg" --exclude=* /src/ /des/